package com.yanxu.bak;

import java.io.File;
import java.io.InputStream;
import java.io.PrintStream;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2025/6/7-2025
 * @Description: 这里用一句话描述这个类的作用
 */
public class BMain {
    public static void main(String[] args) {
        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
        ByteBuffer byteBuffer1 = ByteBuffer.allocate(1024);
        byteBuffer1.putChar('a');// position 为2，指针移动到了2，所以，说明 'a' 占2个字节

        ByteBuffer byteBuffer4 = ByteBuffer.allocate(1024);
        byteBuffer4.putChar('中'); // position 为2，指针移动到了2，所以，说明 '中' 占2个字节

        /********************* 说明java中，char 数据类型占用2个字节。****************************/
        /*
        * 为什么 char 占用2个字节？
        * 因为 java 自己使用的是 UTF-16 字符编码进行存储的。
        * */



        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
        ByteBuffer byteBuffer2 = ByteBuffer.allocate(1024);
        byteBuffer2.putInt(1); // position 为4，指针移动到了2，所以，说明int 占4个字节
        /********************* 说明java中，int 数据类型占用4个字节。****************************/



        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
        ByteBuffer byteBuffer3 = ByteBuffer.allocate(1024);
        byteBuffer3.put("abc".getBytes()); // position 为3
        System.out.println("abc".getBytes().length);
        /*********************************************************************************/
        /*
        * 为什么在这里 字符串  "abc" 最终占用3个字节。
        * 其实这个字符串 "abc" 在jvm 堆内存中占用的就是 2*3=6 个字节的。(包含3个字符，java使用UTF-16,一个字符占用2个字节)
        *
        * 但是，当我们使用 getBytes() 方法的时候，其实在转换为字节的时候，使用的是平台默认的字符编码。
        * 当前平台主流的字符编码都是 utf-8。
        * 在 utf-8 中一个英文字符占用 1个字节、
        * 在 utf-8 中一个中文字符占用 3个字节、
        * 因此，当前字符串中包含3个英文字符，因此，最终计算得到的值为 3.
        * */


        ByteBuffer byteBuffer5 = ByteBuffer.allocate(1024);
        byteBuffer5.put("a".getBytes()); // position 为1

        System.out.println("中".getBytes().length); // 3
        System.out.println("中".getBytes(Charset.forName("utf-16")).length); // 2
        System.out.println("a".getBytes().length); // 1


        System.out.println("end");
    }
}